package com.ecplatform.cart.service.impl;

import com.ecplatform.api.client.ItemClient;
import com.ecplatform.api.pojo.vo.ItemVO;
import com.ecplatform.cart.mapper.CartMapper;
import com.ecplatform.cart.pojo.po.CartItem;
import com.ecplatform.cart.pojo.vo.CartItemVO;
import com.ecplatform.cart.service.ICartService;
import com.ecplatform.common.constant.MessageConstants;
import com.ecplatform.common.exception.ItemException;
import com.ecplatform.common.utils.UserContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

@Service
@Slf4j
@RequiredArgsConstructor
public class CartServiceImpl implements ICartService {

    private final CartMapper cartMapper;

    private final ItemClient itemClient;

    /**
     * 添加商品到购物车
     *
     * @param productId
     * @param quantity
     * @return
     */
    @Override
    public List<CartItemVO> addItemToCart(Long productId, Integer quantity) throws ItemException {

        Long userId = UserContext.getUserId();

        // 1. 查出商品，远程调用商品服务获取商品详情
        ItemVO item = itemClient.selectItemById(productId);
        log.error("当前商品: {}", item);

        // 2. 判断商品库存是否充足
        if (item.getStock() < quantity) {
            throw new ItemException(MessageConstants.ItemStockNotEnough);
        }

        // 3. 判断用户购物车中是否存在该商品，如果存在，则数量增加，否则添加到购物车
        log.error("当前用户: {}", userId);
        CartItem cartItem = cartMapper.selectCartItemByProductId(productId, userId);
        if (cartItem == null) {
            log.info("当前用户购物车中不存在该商品，添加到购物车中");
            // 3.1 计算总价
            BigDecimal totalPrice = item.getPrice().multiply(BigDecimal.valueOf(quantity));
            // 3.2 添加到购物车
            cartMapper.insertNewCartItem(item.getId(), item.getName(), totalPrice, quantity, userId);
        }else {
            log.info("当前用户购物车中已经存在该商品，修改商品数量");
            // 3.1 计算总价
            int newQuantity = cartItem.getQuantity() + quantity;
            BigDecimal totalPrice = item.getPrice().multiply(BigDecimal.valueOf(newQuantity));
            cartMapper.updateCartItemQuantity(productId, quantity, totalPrice, userId);
        }

        // 4. 返回购物车列表
        return cartMapper.getCartItems(userId);
    }
}
